package pe.com.pgn.consolidadorventas.servidorcentral.service.impl;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import pe.com.pgn.consolidadorventas.servidorcentral.dao.ArchivoDao;
import pe.com.pgn.consolidadorventas.servidorcentral.dao.DatabaseObjectDao;
import pe.com.pgn.consolidadorventas.servidorcentral.dao.GlpVentaDao;
import pe.com.pgn.consolidadorventas.servidorcentral.dao.GnvVentaDao;
import pe.com.pgn.consolidadorventas.servidorcentral.dao.ServidorCentralDao;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.Archivo;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.Estacion;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVenta;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaDetalle;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaOpBonus;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaOpDocAnti;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaOpSalesCard;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GlpVentaResumen;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.GnvVentaDetallada;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.factory.GlpDboFactory;
import pe.com.pgn.consolidadorventas.servidorcentral.dbo.factory.GnvDboFactory;
import pe.com.pgn.consolidadorventas.servidorcentral.service.RecargasService;
import pe.com.pgn.consolidadorventas.servidorcentral.util.Constantes;
import pe.com.pgn.consolidadorventas.servidorcentral.util.FechasUtil;
import pe.com.pgn.consolidadorventas.servidorcentral.util.LoggerUtil;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.GlpRptaConsultaVenta;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.GnvRptaConsultaVenta;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVenta;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaDetalle;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaDocAnti;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaOpBonus;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaPrincipal;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.glp.GlpRegistroVentaSalesCard;
import pe.com.pgn.consolidadorventas.servidorcentral.ws.domain.gnv.GnvRegistroVenta;

public class RecargasServiceImpl implements RecargasService {

	static Logger logger = Logger.getLogger(RecargasServiceImpl.class);
	
	private DatabaseObjectDao databaseObjectDao;
	private ArchivoDao archivoDao;
	private GlpVentaDao glpVentaDao;
	private GnvVentaDao gnvVentaDao;
	private ServidorCentralDao servidorCentralGlpDao;
	private ServidorCentralDao servidorCentralGnvDao;
	
	@SuppressWarnings("unchecked")
	public Map<String, Object> recargarInformacionVentas(Map<String, Object> parametros) throws Exception {
		
		Map<String,Object> mapRpta = new HashMap<String,Object>();
		
		String rptaRecarga = "";
		Integer tipoRpta = 0;
		
		Estacion e = (Estacion)parametros.get("estacion");
		String fechaRecarga = (String)parametros.get("fechaRecarga");
		Date dateFechaRecarga = FechasUtil.formatearStringToDate(fechaRecarga);
		Integer modoRecarga = Integer.parseInt((String)parametros.get("modoRecarga"));
		
		String datosEstacion = "["+e.getCodEstacion()+"] "+e.getNombreEstacion()+" ["+e.getIp()+":"+e.getPuerto()+"]";

		//Reenvio para glp
		if(e.getTipoVenta()==Constantes.TIPO_ARCHIVO_GLP){
			LoggerUtil.info(logger,"Inicio recarga GLP : "+datosEstacion);
		}
		if(e.getTipoVenta()==Constantes.TIPO_ARCHIVO_GNV){
			LoggerUtil.info(logger,"Inicio recarga GNV : "+datosEstacion);
		}

		Archivo archivo = archivoDao.consultarCargaDelDia(e.getIdEstacion(),fechaRecarga,e.getTipoVenta());
		
		GlpRptaConsultaVenta rptaGlp = null;
		GnvRptaConsultaVenta rptaGnv = null;
		
		boolean cargarGlp = false;
		boolean cargarGnv = false;

		boolean borrarGlp = false;
		boolean borrarGnv = false;

		if(archivo!=null){
			
			//Recargar un archivo de error
			if(archivo.getTipoCarga() == Constantes.TIPO_CARGA_ERROR && 
					(modoRecarga == Constantes.TIPO_RECARGA_TODOS || modoRecarga == Constantes.TIPO_RECARGA_SOLO_ERROR) ){

				if(e.getTipoVenta() == Constantes.TIPO_ARCHIVO_GLP){
					cargarGlp = true;
				}
				
				if(e.getTipoVenta() == Constantes.TIPO_ARCHIVO_GNV){
					cargarGnv = true;
				}
			}else if( (archivo.getTipoCarga() == Constantes.TIPO_CARGA_MANUAL || archivo.getTipoCarga() == Constantes.TIPO_CARGA_AUTOMATICA) &&
					(modoRecarga == Constantes.TIPO_RECARGA_TODOS || modoRecarga == Constantes.TIPO_RECARGA_SOLO_CORRECTOS) ){
				
				//Recargar un archivo que se proceso correctamente
				//Borrar los datos existentes
				if(e.getTipoVenta() == Constantes.TIPO_ARCHIVO_GLP){
					borrarGlp = true;
					cargarGlp = true;
				}
				
				if(e.getTipoVenta() == Constantes.TIPO_ARCHIVO_GNV){
					borrarGnv = true;
					cargarGnv = true;
				}
			}
			
		}else{
			//Carga de un dia que no tiene ejecucion
			
			//Inicializar el objeto archivo para que se guarde con datos de carga manual
			archivo = new Archivo();
			archivo.setIdEstacion(e.getIdEstacion());
			archivo.setFecha(dateFechaRecarga);
			
			if(e.getTipoVenta()==Constantes.TIPO_ARCHIVO_GLP){
				archivo.setTipoArchivo(Constantes.TIPO_ARCHIVO_GLP);
			}
			if(e.getTipoVenta()==Constantes.TIPO_ARCHIVO_GNV){
				archivo.setTipoArchivo(Constantes.TIPO_ARCHIVO_GNV);
			}
			
			if(modoRecarga == Constantes.TIPO_RECARGA_TODOS || modoRecarga == Constantes.TIPO_RECARGA_SOLO_PENDIENTE){
				
				if(e.getTipoVenta() == Constantes.TIPO_ARCHIVO_GLP){
					cargarGlp = true;
				}
				
				if(e.getTipoVenta() == Constantes.TIPO_ARCHIVO_GNV){
					cargarGnv = true;
				}
			}
		}

		//No se debe borrar si hubo error al cargar los archivos en memoria
		if(borrarGlp){
			
			rptaGlp=(GlpRptaConsultaVenta)servidorCentralGlpDao.consultarInformacionVentasPorDiaModoLocal(e,fechaRecarga);

			if(rptaGlp.getTipoRespuesta() == 1){
				//Borra los datos de glp del dia
				List<GlpVenta> lstVentasGlp = glpVentaDao.obtenerVentasDelDia(archivo.getIdArchivo());
				
				if(lstVentasGlp!=null && lstVentasGlp.size()>0){

					for(GlpVenta glpVenta : lstVentasGlp){
						databaseObjectDao.delete(glpVenta);
						databaseObjectDao.flush();
						databaseObjectDao.removeFromCache(glpVenta);
					}
				}
			}
		}
		
		if(borrarGnv){

			rptaGnv=(GnvRptaConsultaVenta)servidorCentralGnvDao.consultarInformacionVentasPorDiaModoLocal(e,fechaRecarga);
			
			if(rptaGnv.getTipoRespuesta() == 1){
			
				//Borra los datos de gnv del dia
				Map<String,Object> parametrosVentasGnv = new HashMap<String,Object>();
				parametrosVentasGnv.put("codEstacion",e.getCodEstacion());
				parametrosVentasGnv.put("fechaProceso",dateFechaRecarga);
				List<GnvVentaDetallada> lstVentasGnv = gnvVentaDao.listarVentas(parametrosVentasGnv);
				
				if(lstVentasGnv!=null && lstVentasGnv.size()>0){
					for(GnvVentaDetallada gnvVenta : lstVentasGnv){
						databaseObjectDao.delete(gnvVenta);
						databaseObjectDao.flush();
						databaseObjectDao.removeFromCache(gnvVenta);
					}
				}
			}
		}

		if(cargarGlp){
			if(rptaGlp == null){
				rptaGlp=(GlpRptaConsultaVenta)servidorCentralGlpDao.consultarInformacionVentasPorDiaModoLocal(e,fechaRecarga);
			}

			tipoRpta = rptaGlp.getTipoRespuesta();//tipo de respuesta para mostrar si fue error o no la llamada
			
			if(rptaGlp.getTipoRespuesta() == 1){

				SimpleDateFormat formatoFechaHora = new SimpleDateFormat(Constantes.FORMATO_FECHA_HORA);
				Calendar cx = Calendar.getInstance();

				archivo.setTipoCarga(Constantes.TIPO_CARGA_MANUAL);
				archivo.setDescripcionCarga("Carga manual ( "+formatoFechaHora.format(cx.getTime())+" )");
				databaseObjectDao.persist(archivo);
				
				//Recogemos las ventas
				List<GlpRegistroVenta> ventas = rptaGlp.getListaVentas();
				int dim = ventas.size();
				
				try{
					LoggerUtil.info(logger,"Registrando datos de GLP");
					for(int j=0;j<dim;j++){
						//Guardamos el dato principal
						GlpRegistroVenta grv = ventas.get(j);
						GlpRegistroVentaPrincipal p = grv.getPrincipal();
						GlpVenta v = GlpDboFactory.generarDboGlpVenta(archivo, p);
						
						try {
							databaseObjectDao.persist(v);
						} catch (Exception e1) {
							LoggerUtil.error(logger,"Excepcion al registrar el archivo ["+archivo.getIdArchivo()+"] con fecha "+fechaRecarga+" : "+e1.getLocalizedMessage());
							LoggerUtil.error(logger,"Excepcion al registrar el registro con numero de documento: " + v.getNbrDocument());
							throw new Exception(e1.getLocalizedMessage());
						}
						
						//Guardamos los detalles
						List<GlpRegistroVentaDetalle> listaDetalles = grv.getDetalles();
						List<GlpVentaDetalle> listaDboDetalles = (List<GlpVentaDetalle>)GlpDboFactory.generarListaDbo(v,listaDetalles,2);
						databaseObjectDao.persist(listaDboDetalles);
						
						//Guardamos los salescards
						List<GlpRegistroVentaSalesCard> listaSalesCards = grv.getSalesCards();
						List<GlpVentaOpSalesCard> listaDboSalesCard = (List<GlpVentaOpSalesCard>)GlpDboFactory.generarListaDbo(v,listaSalesCards,3);
						databaseObjectDao.persist(listaDboSalesCard);
						
						//Registramos los opDocAntis
						List<GlpRegistroVentaDocAnti> listaOpDocAnti = grv.getDocAntis();
						List<GlpVentaOpDocAnti> listaDboOpDocAnti = (List<GlpVentaOpDocAnti>)GlpDboFactory.generarListaDbo(v, listaOpDocAnti,4);
						databaseObjectDao.persist(listaDboOpDocAnti);
						
						//Registramos los opBonus
						List<GlpRegistroVentaOpBonus> listaOpBonus = grv.getOpBonus();
						List<GlpVentaOpBonus> listaDboOpBonus = (List<GlpVentaOpBonus>)GlpDboFactory.generarListaDbo(v, listaOpBonus, 5);
						databaseObjectDao.persist(listaDboOpBonus);

					}
					
					//Guardamos el resumen
					GlpVentaResumen rs = new GlpVentaResumen();
					LoggerUtil.debug(logger,"Registrando resumen del archivo :"+archivo.getIdArchivo());
					rs.setIdArchivo(archivo.getIdArchivo());
					rs.setCantidadVentas(rptaGlp.getCantidadVentas());
					
					try{
						rs.setTotalVentasPen(new BigDecimal(rptaGlp.getVentaTotal()));					
					}catch(Exception ex){
						LoggerUtil.error(logger, "Error en el total de ventas");
						throw new Exception(ex.getLocalizedMessage());
					}
					
					databaseObjectDao.persist(rs);
					LoggerUtil.debug(logger,"Fin registro resumen del archivo :"+archivo.getIdArchivo());
					LoggerUtil.info(logger,"Fin de registro datos GLP");
					
				}catch(Exception x){
					LoggerUtil.error(logger,"Excepcion al registrar el archivo ["+archivo.getIdArchivo()+"] con fecha "+fechaRecarga+" : "+x.getLocalizedMessage());
					throw new Exception(x.getLocalizedMessage());
				}
				
				rptaRecarga = archivo.getDescripcionCarga();
				
			}else{
				rptaRecarga = rptaGlp.getMensajeError();
			}
		}
		
		if(cargarGnv){
			if(rptaGnv == null){
				rptaGnv=(GnvRptaConsultaVenta)servidorCentralGnvDao.consultarInformacionVentasPorDiaModoLocal(e,fechaRecarga);
			}

			tipoRpta = rptaGnv.getTipoRespuesta();//tipo de respuesta para mostrar si fue error o no la llamada
			
			if(rptaGnv.getTipoRespuesta() == 1){
				SimpleDateFormat formatoFechaHora = new SimpleDateFormat(Constantes.FORMATO_FECHA_HORA);
				Calendar cx = Calendar.getInstance();

				archivo.setTipoCarga(Constantes.TIPO_CARGA_MANUAL);
				archivo.setDescripcionCarga("Carga manual ( "+formatoFechaHora.format(cx.getTime())+" )");
				
				databaseObjectDao.persist(archivo);
				
				List<GnvRegistroVenta> ventas = rptaGnv.getListaVentas();
				int dim = ventas.size();
				
				try{
					LoggerUtil.info(logger,"Registrando datos de GNV");
					for(int j=0;j<dim;j++){
						GnvRegistroVenta g = ventas.get(j);
						GnvVentaDetallada vta = GnvDboFactory.generarDboVentaDetallada(g,rptaGnv.getCodEstacion());
						databaseObjectDao.persist(vta);
					}
					LoggerUtil.info(logger,"Fin de registro datos GNV");
				}catch(Exception ex){
					LoggerUtil.error(logger,"No se pudo registrar los datos de GNV : "+ex.getMessage());
					throw new Exception(ex.getLocalizedMessage());
				}

				rptaRecarga = archivo.getDescripcionCarga();
				
			}else{
				rptaRecarga = rptaGnv.getMensajeError();
			}
			
		}

		if(e.getTipoVenta()==Constantes.TIPO_ARCHIVO_GLP){
			LoggerUtil.info(logger,"Fin recarga GLP : "+datosEstacion);
		}
		if(e.getTipoVenta()==Constantes.TIPO_ARCHIVO_GNV){
			LoggerUtil.info(logger,"Fin recarga GNV : "+datosEstacion);
		}
		
		mapRpta.put("rptaRecarga",rptaRecarga);
		mapRpta.put("tipoRpta",tipoRpta);
		
		return mapRpta;
	}
	

	@SuppressWarnings("unchecked")
	public void recargaAutomaticaEstacion(Map<String, Object> parametros) throws Exception {

			Estacion estacion = (Estacion)parametros.get("estacion");
			String fechaRecarga = (String)parametros.get("fechaRecarga");
			Date dateFechaRecarga = FechasUtil.formatearStringToDate(fechaRecarga);

			Archivo archivo = archivoDao.consultarCargaDelDia(estacion.getIdEstacion(),fechaRecarga,estacion.getTipoVenta());
			
			boolean borrarInformacion = false;
			boolean recargarInformacion = false;

			if(archivo!=null){

				if( (archivo.getTipoCarga() == Constantes.TIPO_CARGA_MANUAL || archivo.getTipoCarga() == Constantes.TIPO_CARGA_AUTOMATICA) &&
					estacion.getModoRecarga().equals(Constantes.TIPO_RECARGA_AUTOMATICA_TODOS) ){
					borrarInformacion = true;
				}
				
				if( archivo.getTipoCarga() == Constantes.TIPO_CARGA_ERROR || estacion.getModoRecarga().equals(Constantes.TIPO_RECARGA_AUTOMATICA_TODOS)){
					recargarInformacion = true;
				}
				
			}else{
				recargarInformacion = true;
			}
			
			GlpRptaConsultaVenta rptaGlp = null;
			GnvRptaConsultaVenta rptaGnv = null;
			
			if(borrarInformacion){
				//No se debe borrar si hubo error al cargar los archivos en memoria
				if(estacion.getTipoVenta() == Constantes.TIPO_VENTA_GLP){
					
					rptaGlp=(GlpRptaConsultaVenta)servidorCentralGlpDao.consultarInformacionVentasPorDia(estacion,fechaRecarga,Constantes.TIPO_VENTA_GLP);

					if(rptaGlp.getTipoRespuesta() == 1){
						//Borra los datos de glp del dia
						List<GlpVenta> lstVentasGlp = glpVentaDao.obtenerVentasDelDia(archivo.getIdArchivo());
						
						if(lstVentasGlp!=null && lstVentasGlp.size()>0){

							for(GlpVenta glpVenta : lstVentasGlp){
								databaseObjectDao.delete(glpVenta);
								databaseObjectDao.flush();
								databaseObjectDao.removeFromCache(glpVenta);
							}
						}
					}
				}
				
				if(estacion.getTipoVenta() == Constantes.TIPO_VENTA_GNV){

					rptaGnv=(GnvRptaConsultaVenta)servidorCentralGnvDao.consultarInformacionVentasPorDia(estacion,fechaRecarga,Constantes.TIPO_VENTA_GNV);
					
					if(rptaGnv.getTipoRespuesta() == 1){
					
						//Borra los datos de gnv del dia
						Map<String,Object> parametrosVentasGnv = new HashMap<String,Object>();
						parametrosVentasGnv.put("codEstacion",estacion.getCodEstacion());
						parametrosVentasGnv.put("fechaProceso",dateFechaRecarga);
						List<GnvVentaDetallada> lstVentasGnv = gnvVentaDao.listarVentas(parametrosVentasGnv);
						
						if(lstVentasGnv!=null && lstVentasGnv.size()>0){
							for(GnvVentaDetallada gnvVenta : lstVentasGnv){
								databaseObjectDao.delete(gnvVenta);
								databaseObjectDao.flush();
								databaseObjectDao.removeFromCache(gnvVenta);
							}
						}
					}
				}
			}
			
			SimpleDateFormat formatoFechaHora = new SimpleDateFormat(Constantes.FORMATO_FECHA_HORA);
			Calendar cx = Calendar.getInstance();
			
			if(recargarInformacion){
				if(estacion.getTipoVenta() == Constantes.TIPO_VENTA_GLP){
					if(rptaGlp == null){
						rptaGlp=(GlpRptaConsultaVenta)servidorCentralGlpDao.consultarInformacionVentasPorDia(estacion,fechaRecarga,Constantes.TIPO_VENTA_GLP);
					}

					if(rptaGlp.getTipoRespuesta() == -1 || rptaGlp.getTipoRespuesta() == 0){
						//-1 no habia ninguno de los archivos
						//0 solo estaba el archivo de error
						if(archivo == null){
							archivo = new Archivo();
							archivo.setIdEstacion(estacion.getIdEstacion());
							archivo.setFecha(dateFechaRecarga);
							archivo.setTipoArchivo(Constantes.TIPO_ARCHIVO_GLP);
							archivo.setTipoCarga(Constantes.TIPO_CARGA_ERROR);
							archivo.setDescripcionCarga(rptaGlp.getMensajeError());
							databaseObjectDao.persist(archivo);
						}else{
							//Se sobreescribe el error siempre y cuando la llamada anterior fue error tambien
							if(archivo.getTipoCarga() == Constantes.TIPO_CARGA_ERROR){
								archivo.setDescripcionCarga(rptaGlp.getMensajeError());
								databaseObjectDao.persist(archivo);
							}
						}
						
					}else{
						if(archivo == null){
							archivo = new Archivo();
							archivo.setIdEstacion(estacion.getIdEstacion());
							archivo.setFecha(dateFechaRecarga);
							archivo.setTipoArchivo(Constantes.TIPO_ARCHIVO_GLP);
						}
						
						archivo.setTipoCarga(Constantes.TIPO_CARGA_AUTOMATICA);
						archivo.setDescripcionCarga("Recarga Automatica ( "+formatoFechaHora.format(cx.getTime())+" )");
						databaseObjectDao.persist(archivo);

						//Recogemos las ventas
						List<GlpRegistroVenta> ventas = rptaGlp.getListaVentas();
						int dim = ventas.size();
						
						try{
							for(int j=0;j<dim;j++){
								//Guardamos el dato principal
								GlpRegistroVenta grv = ventas.get(j);
								GlpRegistroVentaPrincipal p = grv.getPrincipal();
								GlpVenta v = GlpDboFactory.generarDboGlpVenta(archivo, p);
								
								try {
									databaseObjectDao.persist(v);
								} catch (Exception ex) {
									throw new Exception(ex.getLocalizedMessage());
								}
								
								//Guardamos los detalles
								List<GlpRegistroVentaDetalle> listaDetalles = grv.getDetalles();
								List<GlpVentaDetalle> listaDboDetalles = (List<GlpVentaDetalle>)GlpDboFactory.generarListaDbo(v,listaDetalles,2);
								databaseObjectDao.persist(listaDboDetalles);
								
								//Guardamos los salescards
								List<GlpRegistroVentaSalesCard> listaSalesCards = grv.getSalesCards();
								List<GlpVentaOpSalesCard> listaDboSalesCard = (List<GlpVentaOpSalesCard>)GlpDboFactory.generarListaDbo(v,listaSalesCards,3);
								databaseObjectDao.persist(listaDboSalesCard);
								
								//Registramos los opDocAntis
								List<GlpRegistroVentaDocAnti> listaOpDocAnti = grv.getDocAntis();
								List<GlpVentaOpDocAnti> listaDboOpDocAnti = (List<GlpVentaOpDocAnti>)GlpDboFactory.generarListaDbo(v, listaOpDocAnti,4);
								databaseObjectDao.persist(listaDboOpDocAnti);
								
								//Registramos los opBonus
								List<GlpRegistroVentaOpBonus> listaOpBonus = grv.getOpBonus();
								List<GlpVentaOpBonus> listaDboOpBonus = (List<GlpVentaOpBonus>)GlpDboFactory.generarListaDbo(v, listaOpBonus, 5);
								databaseObjectDao.persist(listaDboOpBonus);

							}
							
							//Guardamos el resumen
							GlpVentaResumen rs = new GlpVentaResumen();
							rs.setIdArchivo(archivo.getIdArchivo());
							rs.setCantidadVentas(rptaGlp.getCantidadVentas());
							
							try{
								rs.setTotalVentasPen(new BigDecimal(rptaGlp.getVentaTotal()));					
							}catch(Exception ex){
								throw new Exception(ex.getLocalizedMessage());
							}
							
							databaseObjectDao.persist(rs);

						}catch(Exception x){
							throw new Exception(x.getLocalizedMessage());
						}
					}
				}
				
				if(estacion.getTipoVenta() == Constantes.TIPO_VENTA_GNV){

					if(rptaGnv == null){
						rptaGnv=(GnvRptaConsultaVenta)servidorCentralGnvDao.consultarInformacionVentasPorDia(estacion,fechaRecarga,Constantes.TIPO_VENTA_GNV);
					}

					if(rptaGnv.getTipoRespuesta() == -1 || rptaGnv.getTipoRespuesta() == 0){
						//-1 no habia ninguno de los archivos
						//0 solo estaba el archivo de error
						if(archivo == null){
							archivo = new Archivo();
							archivo.setIdEstacion(estacion.getIdEstacion());
							archivo.setFecha(dateFechaRecarga);
							archivo.setTipoArchivo(Constantes.TIPO_ARCHIVO_GNV);
							archivo.setTipoCarga(Constantes.TIPO_CARGA_ERROR);
							archivo.setDescripcionCarga(rptaGnv.getMensajeError());
							databaseObjectDao.persist(archivo);
						}else{
							//Se sobreescribe el error siempre y cuando la llamada anterior fue error tambien
							if(archivo.getTipoCarga() == Constantes.TIPO_CARGA_ERROR){
								archivo.setDescripcionCarga(rptaGnv.getMensajeError());
								databaseObjectDao.persist(archivo);
							}
						}
						
						
					}else{

						if(archivo == null){
							archivo = new Archivo();
							archivo.setIdEstacion(estacion.getIdEstacion());
							archivo.setFecha(dateFechaRecarga);
							archivo.setTipoArchivo(Constantes.TIPO_ARCHIVO_GNV);
						}
						
						archivo.setTipoCarga(Constantes.TIPO_CARGA_AUTOMATICA);
						archivo.setDescripcionCarga("Recarga automatica ( "+formatoFechaHora.format(cx.getTime())+" )");
						databaseObjectDao.persist(archivo);
						
						List<GnvRegistroVenta> ventas = rptaGnv.getListaVentas();
						int dim = ventas.size();
						
						try{
							for(int j=0;j<dim;j++){
								GnvRegistroVenta g = ventas.get(j);
								GnvVentaDetallada vta = GnvDboFactory.generarDboVentaDetallada(g,rptaGnv.getCodEstacion());
								databaseObjectDao.persist(vta);
							}

						}catch(Exception ex){
							throw new Exception(ex.getLocalizedMessage());
						}
					}
				}
			}
		
	}

	public DatabaseObjectDao getDatabaseObjectDao() {
		return databaseObjectDao;
	}

	public void setDatabaseObjectDao(DatabaseObjectDao databaseObjectDao) {
		this.databaseObjectDao = databaseObjectDao;
	}

	public ArchivoDao getArchivoDao() {
		return archivoDao;
	}

	public void setArchivoDao(ArchivoDao archivoDao) {
		this.archivoDao = archivoDao;
	}

	public GlpVentaDao getGlpVentaDao() {
		return glpVentaDao;
	}

	public void setGlpVentaDao(GlpVentaDao glpVentaDao) {
		this.glpVentaDao = glpVentaDao;
	}

	public GnvVentaDao getGnvVentaDao() {
		return gnvVentaDao;
	}

	public void setGnvVentaDao(GnvVentaDao gnvVentaDao) {
		this.gnvVentaDao = gnvVentaDao;
	}

	public ServidorCentralDao getServidorCentralGlpDao() {
		return servidorCentralGlpDao;
	}

	public void setServidorCentralGlpDao(ServidorCentralDao servidorCentralGlpDao) {
		this.servidorCentralGlpDao = servidorCentralGlpDao;
	}

	public ServidorCentralDao getServidorCentralGnvDao() {
		return servidorCentralGnvDao;
	}

	public void setServidorCentralGnvDao(ServidorCentralDao servidorCentralGnvDao) {
		this.servidorCentralGnvDao = servidorCentralGnvDao;
	}

}